package exercises.leetcode;

/**
 * <a href="https://leetcode-cn.com/problems/license-key-formatting/">
 * 482. 密钥格式化</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 有一个密钥字符串 S ，只包含字母，数字以及 '-'（破折号）。其中， N 个 '-' 将字符串分成了 N+1 组。
 * <p>
 * 给你一个数字 K，请你重新格式化字符串，使每个分组恰好包含 K 个字符。特别地，第一个分组包含的字符个数必须小于等于 K，但至少要包含 1 个字符。两个分组之间需要用 '-'（破折号）隔开，并且将所有的小写字母转换为大写字母。
 * <p>
 * 给定非空字符串 S 和数字 K，按照上面描述的规则进行格式化。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：S = "5F3Z-2e-9-w", K = 4
 * <p>
 * 输出："5F3Z-2E9W"
 * <p>
 * 解释：字符串 S 被分成了两个部分，每部分 4 个字符；
 *      注意，两个额外的破折号需要删掉。
 * <p>
 * 示例 2：
 * <p>
 * 输入：S = "2-5g-3-J", K = 2
 * <p>
 * 输出："2-5G-3J"
 * <p>
 * 解释：字符串 S 被分成了 3 个部分，按照前面的规则描述，第一部分的字符可以少于给定的数量，其余部分皆为 2 个字符。
 *  
 * <p>
 * 提示:
 * <li>S 的长度可能很长，请按需分配大小。K 为正整数。</li>
 * <li>S 只包含字母数字（a-z，A-Z，0-9）以及破折号'-'</li>
 * <li>S 非空</li>
 *
 * @author or2
 * @date 2021年10月04日 时间: 8:16
 */
public class No482 {
    public String licenseKeyFormatting(String s, int k) {
        char[] res; int cnt = 0; int length = s.length();
        for (int i = length - 1; i >= 0; i--)
            if (s.charAt(i) == '-')
                cnt++;
        res = new char[length - cnt + (length - cnt - 1) / k];

        cnt = res.length;
        for (int i = length - 1, count = 0; i >= 0; i--) {
            if (s.charAt(i) == '-')
                continue;
            res[--cnt] = Character.toUpperCase(s.charAt(i));
            count++;
            if (count == k && cnt > 0) {
                res[--cnt] = '-';
                count = 0;
            }
        }

        return new String(res);
    }
}
